/** 
 * 闭包
 *  闭包是指有权访问另一个函数作用域中变量的函数
 *  1、闭包是个函数
 *  2、这个函数有权访问另一个函数的局部变量
 *  3、闭包的生成的2个条件：在一个函数去声明另一个函数，并且这个函数访问了另一个函数的局部变量，
 *  4、闭包的主要作用延申了变量的作用范围
 */

/**
 * 闭包
 *      闭包是指有权访问另一个函数作用域中的变量的函数
 *      闭包的特点
            1.函数嵌套函数
            2.函数内部可以引用外部的参数和变量
            3.参数和变量不会被垃圾回收机制回收，直到第二个函数执行完并被设置为null
        闭包的优点
            1.希望一个变量长期驻扎在内存中
            2.避免全局变量的污染
            3.私有成员的存在
 */


/* function fn() {
    var num = 1;
    function fun() {
        // console.log(num) // fn就是闭包
    }
    fun()
}
fn() */

// 闭包的应用
// 函数fn外面的作用域调用函数fn内部的变量
// 其实是通过一个高阶函数来完成
/* function fn() {
    var num = 1;

    // 这个函数就是闭包
    // function fun() {
    //     console.log(num)
    // }
    // return fun;
    return function() {
        console.log(num)
    }
}
var f = fn()
f() */




// 以下情况没有闭包产生，因为没有局部变量
// var o = {
//     name: '波仔',
//     fn: function() {
//         return function() {
//             console.log(this.name)
//         }
//     }
// }

// var f = o.fn()

function fn() {
    var num = 1;
    function fun() {
        console.log(num)
    }
    fun()
}
fn()